;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;			Font	  ;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; This is for generating the font! yey

;;;;; Declaratie addressencode

fullasci	equ 040h	;Onthoudt volledige asci-code
offset		equ 041h	;Onthoudt asci-firstchr: de offset dus
lengte		equ 042h	;Onthoudt hoeveel lijnen er nog moeten afgeprint worden
woordlengte	equ	043h	;Onthoudt lengte van het woord
letadresL	equ 044h	;Onthoudt adres waar letter begint-low
letadresH	equ 045h	;Onthoudt adres waar letter begint-high
;woordpoint	equ 046h	;pointer naar het woord
tijdplijnH	equ 047h	;Onthou tijd per lijn nodig.Highbyte
tijdplijnM	equ 048h	;	Mediumbyte
tijdplijnL	equ	049h	;	Lowbyte
tijdplijnMB	equ 04Ah	;	Mediumbyte berekend
tijdplijnLB	equ	04Bh	;	Lowbyte	berekend

intTijd0H	equ 04Ch	;onthou counter voor highbyte zodat timer0 24 bit is.
intLijn		equ	04Dh	;onthou hoeveel lijnen de interruptroutine al gedaan heeft.

;intTijd1H	equ	04Eh	;Adres al gebruikt voor intTijd1H, staat in accelerometer.inc


XRAMstart	equ	00000h	;Adres waar woordlijnen worden opgeslagen in XRAM.

;;;;; Declaratie constanten

nr_chrs 	equ 95
firstchr	equ 32

;;;;; Declaratie tabbelen

;; Lengtes per letter
lentbl_S: db 3,3,3,5,5,5,5,3
		  db 3,3,5,5,2,5,1,5
		  db 5,5,5,5,5,5,5,5
		  db 5,5,1,2,4,4,4,5
		  db 5,5,5,5,5,5,5,5
		  db 5,3,5,5,4,5,5,5
		  db 5,5,5,5,5,5,5,7
		  db 5,5,5,3,5,3,5,5
		  db 3,4,5,4,5,4,4,4
		  db 5,2,3,4,3,6,5,4
		  db 5,5,5,4,3,5,5,5
		  db 5,4,4,3,3,3,2

;; Adressen van letters
chrtbl_S:
		  dw chrS_20,chrS_21,chrS_22,chrS_23,chrS_24,chrS_25,chrS_26,chrS_27
		  dw chrS_28,chrS_29,chrS_2A,chrS_2B,chrS_2C,chrS_2D,chrS_2E,chrS_2F
		  dw chrS_30,chrS_31,chrS_32,chrS_33,chrS_34,chrS_35,chrS_36,chrS_37
		  dw chrS_38,chrS_39,chrS_3A,chrS_3B,chrS_3C,chrS_3D,chrS_3E,chrS_3F
		  dw chrS_40,chrS_41,chrS_42,chrS_43,chrS_44,chrS_45,chrS_46,chrS_47
		  dw chrS_48,chrS_49,chrS_4A,chrS_4B,chrS_4C,chrS_4D,chrS_4E,chrS_4F
		  dw chrS_50,chrS_51,chrS_52,chrS_53,chrS_54,chrS_55,chrS_56,chrS_57
		  dw chrS_58,chrS_59,chrS_5A,chrS_5B,chrS_5C,chrS_5D,chrS_5E,chrS_5F
		  dw chrS_60,chrS_61,chrS_62,chrS_63,chrS_64,chrS_65,chrS_66,chrS_67
		  dw chrS_68,chrS_69,chrS_6A,chrS_6B,chrS_6C,chrS_6D,chrS_6E,chrS_6F
		  dw chrS_70,chrS_71,chrS_72,chrS_73,chrS_74,chrS_75,chrS_76,chrS_77
		  dw chrS_78,chrS_79,chrS_7A,chrS_7B,chrS_7C,chrS_7D,chrS_7E

;; De letters zelf
chrS_20:   db 00h,00h,00h
chrS_21:   db 00h,5Fh,00h
chrS_22:   db 07h,00h,07h
chrS_23:   db 14h,7Fh,14h,7Fh,14h
chrS_24:   db 26h,49h,7Fh,49h,32h
chrS_25:   db 63h,13h,08h,64h,63h
chrS_26:   db 36h,49h,00h,22h,50h
chrS_27:   db 04h,03h,00h
chrS_28:   db 1Ch,22h,41h
chrS_29:   db 41h,22h,1Ch
chrS_2A:   db 14h,08h,3Eh,08h,14h
chrS_2B:   db 08h,08h,3Eh,08h,08h
chrS_2C:   db 80h,60h
chrS_2D:   db 08h,08h,08h,08h,08h
chrS_2E:   db 40h
chrS_2F:   db 60h,10h,08h,04h,03h
chrS_30:   db 3Eh,51h,49h,45h,3Eh
chrS_31:   db 00h,42h,7Fh,40h,00h
chrS_32:   db 62h,51h,49h,49h,46h
chrS_33:   db 22h,41h,49h,49h,36h
chrS_34:   db 18h,14h,12h,7Fh,10h
chrS_35:   db 27h,49h,49h,49h,31h
chrS_36:   db 3Ch,4Ah,49h,49h,30h
chrS_37:   db 01h,71h,09h,05h,03h
chrS_38:   db 36h,49h,49h,49h,36h
chrS_39:   db 06h,49h,49h,29h,1Eh
chrS_3A:   db 14h
chrS_3B:   db 80h,68h
chrS_3C:   db 08h,14h,22h,41h
chrS_3D:   db 14h,14h,14h,14h
chrS_3E:   db 41h,22h,14h,08h
chrS_3F:   db 02h,01h,51h,09h,06h
chrS_40:   db 3Eh,41h,5Dh,00h,4Eh
chrS_41:   db 7Ch,12h,11h,12h,7Ch
chrS_42:   db 7Fh,49h,49h,49h,36h
chrS_43:   db 3Eh,41h,41h,41h,22h
chrS_44:   db 7Fh,41h,41h,22h,1Ch
chrS_45:   db 7Fh,49h,49h,49h,41h
chrS_46:   db 7Fh,09h,09h,09h,01h
chrS_47:   db 3Eh,41h,49h,29h,72h
chrS_48:   db 7Fh,08h,08h,08h,7Fh
chrS_49:   db 41h,7Fh,41h
chrS_4A:   db 20h,40h,41h,3Fh,01h
chrS_4B:   db 7Fh,08h,14h,22h,41h
chrS_4C:   db 7Fh,40h,40h,40h
chrS_4D:   db 7Fh,02h,0Ch,02h,7Fh
chrS_4E:   db 7Fh,06h,08h,30h,7Fh
chrS_4F:   db 3Eh,41h,41h,41h,3Eh
chrS_50:   db 7Fh,09h,09h,09h,06h
chrS_51:   db 3Eh,41h,51h,21h,5Eh
chrS_52:   db 7Fh,09h,19h,29h,46h
chrS_53:   db 26h,49h,49h,49h,32h
chrS_54:   db 01h,01h,7Fh,01h,01h
chrS_55:   db 3Fh,40h,40h,40h,3Fh
chrS_56:   db 0Fh,30h,40h,30h,0Fh
chrS_57:   db 0Fh,30h,40h,38h,40h,30h,0Fh
chrS_58:   db 63h,14h,08h,14h,63h
chrS_59:   db 07h,08h,70h,08h,07h
chrS_5A:   db 61h,51h,49h,45h,43h
chrS_5B:   db 7Fh,41h,41h
chrS_5C:   db 03h,04h,08h,10h,60h
chrS_5D:   db 41h,41h,7Fh
chrS_5E:   db 08h,04h,02h,04h,08h
chrS_5F:   db 40h,40h,40h,40h,40h
chrS_60:   db 03h,04h,00h
chrS_61:   db 20h,54h,54h,78h			;a
chrS_62:   db 7Fh,28h,44h,44h,38h
chrS_63:   db 38h,44h,44h,28h
chrS_64:   db 38h,44h,44h,28h,7Fh
chrS_65:   db 38h,54h,54h,48h
chrS_66:   db 08h,7Eh,09h,02h
chrS_67:   db 98h,0A4h,0A4h,58h
chrS_68:   db 7Fh,08h,04h,04h,78h
chrS_69:   db 3Dh,40h
chrS_6A:   db 80h,84h,7Dh
chrS_6B:   db 7Fh,10h,28h,44h
chrS_6C:   db 01h,7Fh,00h
chrS_6D:   db 7Ch,08h,04h,78h,04h,78h
chrS_6E:   db 7Ch,08h,04h,04h,78h
chrS_6F:   db 38h,44h,44h,38h
chrS_70:   db 0FCh,18h,24h,24h,18h
chrS_71:   db 18h,24h,24h,18h,0FCh
chrS_72:   db 7Ch,08h,04h,04h,08h
chrS_73:   db 48h,54h,54h,24h
chrS_74:   db 04h,3Eh,44h
chrS_75:   db 3Ch,40h,40h,20h,7Ch
chrS_76:   db 1Ch,20h,40h,20h,1Ch
chrS_77:   db 3Ch,40h,30h,40h,3Ch
chrS_78:   db 44h,28h,10h,28h,44h
chrS_79:   db 1Ch,0A0h,0A0h,7Ch
chrS_7A:   db 64h,54h,54h,4Ch
chrS_7B:   db 08h,36h,41h
chrS_7C:   db 00h,7Fh,00h
chrS_7D:   db 41h,36h,08h
chrS_7E:   db 00h,00h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Printletterpause
;; Zal letters uitprinten op p2 met pause tussen.
;; Geef letter door via accumulator
;;

printletterpause:
			push	dpl
			push	dph

			mov 	fullasci,a		;Bewaar asci-code van letter

			subb	a,#firstchr 	;Trek er eerste letter van af
			mov 	offset,a		;Onthou hoeveelste letter dat hij is.

			;subb

			mov 	dptr,#lentbl_S	;Ga naar lengtetabel
			movc	a,@a+dptr		;Ga de juiste lengte uit tabel halen
			mov 	lengte,a		;Onthou lengte

			mov 	a,offset		;zet offset weer in acc
			mov 	b,#2h			;Zet twee in b
			mul 	ab				;Doe maal twee ==> Dit is omdat we met woorden werken en dus twee keer zo ver moeten kijken
			mov 	dptr,#chrtbl_S	;Ga naar letterpointertabel
			push	acc 			;Onthou a eventjes
			movc	a,@a+dptr		;Haal dpH van letteradres
			mov 	letadresH,a 	;onthou dit adres
			pop 	acc
			inc 	a				;Ga nu een keer verder kijken als daarjuist
			movc	a,@a+dptr		;Haal dpL van letteradres
			mov 	letadresL,a 	;onthou dit adres

			ljmp	printlijninit	;Doe dit weg als je terug wilt debuggen

			mov 	a,fullasci
			lcall	outbytelcd

			mov 	a,#" "
			lcall	outcharlcd


			mov 	a,offset
			lcall	outbytelcd

			mov 	a,#" "
			lcall	outcharlcd


			mov 	a,lengte
			lcall	outbytelcd

			mov 	a,#" "
			lcall	outcharlcd



printlijninit:
			mov 	dph,letadresH	;laad datapointer-high
			mov 	dpl,letadresL	;laad datapointer-low
			mov 	a,#00h			;Maak accumulator leeg, er is geen offset nodig

printlijnlus:
			push	acc 			;onthou accumulator
			movc	a,@a+dptr		;Haal lijn uit tabel
			lcall	lijnout
			pop 	acc 			;haal acc terug (voor offset)
			inc 	acc 			;tel er eentje bij op zodat we volgende lijn nemen
			lcall	pause			;Dit kunnen we later vervangen door wacht op volgende keer dat het mag
			djnz	lengte,printlijnlus

printletterpauseexit:
			pop 	dph
			pop 	dpl
			ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Lijnout
;; Dit wordt op termijn gekoppeld met de leddriver.
;; Voorlopig wordt p2 nog gebruikt
;;
;;	IN: 	acc:	lijn-uitzicht
;;	OUT:	p2:		aangesloten ledjes branden zoals gezegd.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lijnout:	//Via onboard-ledjes
			/* 
			cpl 	a				;Inverteer voor actief laag ============================================>>>>>>>
			mov 	p2,a			;Zet het op ledjes
			*/

			// Voor Leddriver
			lcall	ledout			;schrijf het naar led
			ret



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; lengteWoord bereketen de lengte van het gegeven woord.  Het startadres wordt
; meegegeven via de datapointer en er wordt afgesloten met 000h.
; Resultaat wordt via acc. teruggegeven.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lengteWoord:  push	psw 			;registers op de stack
			  push	dph 			;ook de data pointer
			  push	dpl
			  push	01h;r1		   ;Hierin zal lengte bewaard worden
			  mov	r1,#000h		;clear r1 zodat lengte erin opgeslagen kan

;We lezen karakters uit code memory tot de 000h code gevonden wordt.

lengteWoord1: clr	a				;waarde zit in onze weg
			  movc	a,@a+dptr		;waarde lezen
			  jz	lengteWoorde	;als 0 dan naar einde springen

; de code is niet 0 dus versturen met outchar

			  lcall lengteLetter	;vraag lengte van letter op
			  add	a,r1			;tel er de vorige lengtes bij op
			  mov	r1,a			;onthou dit terug
			  inc	dptr			;naar volgende ascii code wijzen
			  ljmp	lengteWoord1	 ;lus sluiten

lengteWoorde:	mov		a,r1		;geef resultaat terug via acc
				pop		1h;r1
				pop		dpl			  ;registers herstellen
				pop   	dph
				pop   	psw
				ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; lengteLetter berekent de lengte van de gegeven letter in de accumulator.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lengteLetter:
			push	dpl
			push	dph

			mov 	fullasci,a		;Bewaar asci-code van letter

			subb	a,#firstchr 	;Trek er eerste letter van af
			mov 	offset,a		;Onthou hoeveelste letter dat hij is.

			mov 	dptr,#lentbl_S	;Ga naar lengtetabel
			movc	a,@a+dptr		;Ga de juiste lengte uit tabel halen
			mov 	lengte,a		;Onthou lengte

			pop		dph				;VERGEET GVD NIKS TE POPPEN!!!!! AAAARRRGGGHHHH!!!
			pop		dpl
			ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; berekentijd berekent de tijd die nodig is per lijn.  Lengte wordt meegegeven
; via acc. en het resultaat wordt teruggegeven via acc.
; Lengte is liefst minstens 21 lang.  Vanaf dan is het resultaat maar max 16bit.
;
;	IN: 	acc: lengte van woord
;	OUT:	r2,r1,r0: tijd nodig per lijn. (msb = r2)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

berekentijd:
			push 	acc
			push	psw
			setb	rs0			;gebruik andere registerbank

			mov		r3,#000h
			mov		r2,totTijdH		
			mov		r1,totTijdM
			mov		r0,totTijdL

			mov 	r7,#00h		;Laad het tweede getal in.  Enkel in acc zal iets zitten want lengte kan niet zo groot worden
			mov		r6,#00h
			mov		r5,#00h
			mov		r4,acc		;Laad de lengte in
 
 			lcall	div32		;Doe de deling
			mov		a,r6
			push	acc
			mov		a,r5
			push	acc
			mov		a,r4
			push	acc
			clr		rs0			;gebruik terug originele registerbank
			pop		acc
			mov		r0,a
			pop		acc
			mov		r1,a
			pop		acc
			mov		r2,a
			pop		psw
			pop 	acc
			ret					;Voor debug, deze lijn (ret) in commentaar zetten

			;; Effe output voor debug

			mov		a,#00dh
			lcall	outcharlcd

			mov		a,woordLengte
			lcall	outbytelcd
			
			mov		a,#" "
			lcall	outcharlcd
			
			mov		a,r2
			lcall	outbytelcd
			
			mov		a,#" "
			lcall	outcharlcd

			mov		a,r1
			lcall	outbytelcd
			
			mov		a,#" "
			lcall	outcharlcd
			
			mov		a,r0
			lcall	outbytelcd
			
			jmp 	$+1

			mov		a,#"X"
			lcall	outcharlcd
			;;
			ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  interruptWoordInit stelt timer in voor interrupt, berekent de lijnen
;  en zorgt ervoor dat alles juist staat ingesteld in feite.  
;
;	IN: 	dtpr: startadres van het te tonen woord.  Eindig met '\0' ofwel 0h
; 	OUT: 	/
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

interruptWoordInit:

			setb	ea				;alle intterupts zijn toegelaten
			setb	et0				;timer0interrupts mogen doorkomen
			mov     pllcon,#0100000b;zet op 16MHz.  Gewoon doen.
			orl	   	CFG832,#0000001b;Dit zorgt ervoor dat interne XRAM bruikbaar wordt
			mov		TMOD,#00010001b	;Dit zet timer 0 en 1 op 16bit timermode.
			mov		TCON,#00000000b	;Dit zet timer 0 en 1 juist.			
			
IWinit:		mov		acc,woordlengte
			lcall	berekentijd		;bereken tijd per lijn
			mov		tijdplijnH,r2	;Onthou ze
			mov		tijdplijnM,r1	; "
			
			mov		intLijn,#000h	;maak intLijn leeg
			

			mov		intTijd0H,tijdplijnH; maak timer0 24 bit met deze extra counter (aftellend wel nu!)

			mov		r0,#000h				;bereken waarde voor timer0 want deze telt op!
			mov		r1,#000h
			mov		r3,tijdplijnM
			mov		r2,tijdplijnL
			lcall	sub16
			cjne	r2,#0FFh,errInWIsub	;Als r2 niet FF is, geef dan errormessage
			mov		TH0,r1			;Zet waarde in timer0
			mov		TL0,r0
			mov		tijdplijnMB,r1	;bewaar berekende waarde
			mov		tijdplijnLB,r0	;bewaar berekende waarde echt
			;timer0 is nu ingesteld, maar nog niet gestart.

			;Kopieer woord naar geheugen.

			mov		dpcon,#00000001b	;gewone datapointers,geen auto-increment,selecteer shadowdatapointer
			mov		dptr,#XRAMstart	 	;laad startadres waar opgeslagen mag worden
			;mov		dpl,XRAMstart	;moet tussen 0 en 2000h liggen.
			anl		dpcon,#11111110b	;selecteer gewone datapointer
			
			mov		dph,woordpointH		;laad woord in
			mov		dpl,woordpointL

kopieerWoord1: 
			clr		a				;waarde zit in onze weg
			movc	a,@a+dptr		;waarde lezen
			jz		kopieerWoorde	;als 0 dan naar einde springen
			lcall 	kopieerLetter	;vraag lengte van letter op
			inc		dptr			;neem volgende letter
			ljmp	kopieerWoord1	;lus sluiten

kopieerWoorde:
			ret				

	;;;
	; Errorbericht voor deze functie

errInWIsub:	mov		dptr,#errMsgSub
			lcall	outmsgalcd
			mov		a,r2
			lcall	outbytelcd
			mov		a,' '
			lcall	outcharlcd
			mov		a,r1
			lcall	outbytelcd
			mov		a,' '
			lcall	outcharlcd
			mov		a,r0
			lcall	outbytelcd
loopje:		ljmp	loopje
errMsgSub:	db		00dh,"ERR.1: Int-sub",00ah,0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; kopierLetter
;; 	kopieert letter naar XRAMgeheugen.  Zorg ervoor dat schaduwDPTR al juist staat.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

kopieerLetter:
			push	dpl
			push	dph

			mov 	fullasci,a		;Bewaar asci-code van letter

			subb	a,#firstchr 	;Trek er eerste letter van af.  Dit voor offset
			mov 	offset,a		;Onthou hoeveelste letter dat hij is.

			mov 	dptr,#lentbl_S	;Ga naar lengtetabel
			movc	a,@a+dptr		;Ga de juiste lengte uit tabel halen
			mov 	lengte,a		;Onthou lengte

			mov 	a,offset		;zet offset weer in acc
			mov 	b,#2h			;Zet twee in b
			mul 	ab				;Doe maal twee ==> Dit is omdat we met woorden werken en dus twee keer zo ver moeten kijken
			mov 	dptr,#chrtbl_S	;Ga naar letterpointertabel
			push	acc 			;Onthou a eventjes
			movc	a,@a+dptr		;Haal dpH van letteradres
			mov 	letadresH,a 	;onthou dit adres
			pop 	acc
			inc 	a				;Ga nu een keer verder kijken als daarjuist
			movc	a,@a+dptr		;Haal dpL van letteradres
			mov 	letadresL,a 	;onthou dit adres

			mov 	dph,letadresH	;laad datapointer-high
			mov 	dpl,letadresL	;laad datapointer-low
			mov 	a,#00h			;Maak accumulator leeg, er is geen offset nodig

kopieerlijnlus:
			push	acc 			;onthou accumulator
			movc	a,@a+dptr		;Haal lijn uit tabel
 		
			;Kopieer naar XRAM
			orl		dpcon,#00000001b;neem shadowdatapointer
			movx	@dptr,a			;bewaar lijn in XRAMgeheugen
			inc		dptr			;incrementeer datapointer
			anl		dpcon,#11111110b;neem terug maindatapointer

			pop 	acc 			;haal acc terug (voor offset)
			inc 	acc 			;tel er eentje bij op zodat we volgende lijn nemen
			djnz	lengte,kopieerlijnlus

kopieerLetterexit:
			pop 	dph
			pop 	dpl
			ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; interruptWoord is de interrupt-routine voor het uiprinten van het woord 
;  op de juiste tijd via timer0.
;
;	IN: 	timer0-overflow
; 	OUT: 	/
;
;	XRAMstart	equ	00000h	;Adres waar woordlijnen worden opgeslagen in XRAM.
;   woordlengte	equ	043h	;Onthoudt lengte van het woord
;	intTijd0H	equ 04Ah	;onthou counter voor highbyte zodat timer0 24 bit is.
;	intLijn		equ	04Bh	;onthou hoeveel lijnen de interruptroutine al gedaan heeft.
;
;	tijdplijnH	equ 047h	;Onthou tijd per lijn nodig.Highbyte
;	tijdplijnMB	equ 04Ah	;	Mediumbyte berekend
;	tijdplijnLB	equ	04Bh	;	Lowbyte	berekend
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;			
	

interruptWoord:
			push	psw
			push 	dph
			push	dpl
			push	acc
			
			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			;mov		a,#"a"
			;lcall	outcharlcd

			mov		a,intLijn
			cjne	a,woordlengte,IWvervolg 	;Als het woord afgeprint is, doe dan niets...
			jmp		interruptWoordOp

IWvervolg:	setb	TR0				;zet timer 0 weer op voor indien we nogmaals moeten tellen met 24bit.
			mov		acc,intTijd0H	;Haal hoogste byte voor te kijken of we effectief nog moeten verdertellen.
			jz		interruptWoordDoeLijn
			dec		a				;We moeten nog verdertellen, decrement highbyte van tijd
			mov		intTijd0H,a		;bewaar
			jmp		interruptWoordE	;Stop interruptroutine
			
interruptWoordDoeLijn:
			clr		TR0				;zet timer 0 weer af.
			mov		intTijd0H,tijdplijnH	;
			mov		TH0,tijdplijnMB	;stel timer 0 weer juist in
			mov		TL0,tijdplijnLB	;stel timer 0 weer juist in
			setb	TR0				;zet timer0 weer aan.  Op die 8 instructies zal het wel niet aankomen qua tijdverschil

			mov		dptr,#XRAMstart	;zet datapointer weer goed
			mov		a,intLijn		;zet accumulator op goede plek
			add		a,dpl			;tel op bij datapointer
			mov		dpl,a			;bewaar terug in datapointer.  Geen overflowdetectie, maar is ook niet nodig.

			movx	a,@dptr			;haal lijn op uit XRAM
			lcall	lijnout			;print lijn uit

			inc		intLijn			;Ga naar volgende lijn voor volgende keer
						
			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
interruptWoordE:
			pop		acc
			pop		dpl
			pop		dph
			pop		psw
			reti

;Dit dient om terug display leeg te maken na afprinten

interruptWoordOp:
			clr		TR0				;Zet timer af!
			lcall	LEDstop			;we hebben gedaan met doorsturen
			jmp		interruptWoordE


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; interruptWoordStart
;; 	start interruptWoord als dat ingesteld is, anders rare effecten...
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
interruptWoordStart:
			lcall	LEDstart
			setb	TR0				;start timer0
			ret

